package Gradle基础;

多项目构建

Gradle支持多项目构建，以实现项目的快速发展。它有助于模块化项目。它使我们能够专注于大型项目的一个模块。 Gradle处理项目其他部分产生的依赖关系。

多项目构建由一个根项目(root project)和一个或多个子项目(multiple subprojects)组成。

《跨项目配置》
每个子项目都可以完全隔离其他子项目进行配置，因此，这些子项目具有共同的特征。最好在项目之间共享配置，以便同一配置可以影响许多子项目。

《配置和执行》
在Gradle中，配置意味着执行项目的" build.gradle"。默认情况下，配置在执行任何任务之前完成。当请求来自项目的单个任务时，则首先配置多项目构建。配
置项目后，在访问和更新Gradle项目的任何模块时，它会变得更加灵活。

《创建一个多项目》
让我们创建一个包含其子项目的项目，并构建Gradle项目。

与以下项目结构一起使用，其中根项目名称为 Multi_project ，子项目名称为 sub_project 。

创建一个新的根目录，我们要在其中创建一个多项目。使用以下命令创建一个新目录:
mkdir Multi_project

创建一个Gradle building； Multi_Project目录。要创建Gradle构建，请运行gradle init命令。 init命令包含包装程序命令本身，因此它将在根项目
中创建 build.gradle 和 setting.gradle 文件。

以下是创建Gradle项目的过程:

当我们执行init命令时，它将要求我们要生成的项目类型。它提供了四种类型的项目选项。它们如下:

Basic
Application
Library
Gradle plugin
选择所需的选项，然后按Enter键继续。

接下来，它将要求我们提供所需的构建脚本DSL。 DSL有两个选项:

Groovy
Kotlin
选择所需的DSL，然后按Enter键继续。

现在它将要求我们提供项目名称。我们可以提供任何项目名称，默认情况下，如果未提供，它将以目录名称作为项目名称。

按ENTER键继续。考虑以下输出:

Multi-Project Build in Gradle
现在创建如下的多项目树结构:

f:\Multi_project>mkdir sub_project
	
Multi_project/

      - build.gradle

      - setting.gradle

Sub_project/

      - build.gradle

      - setting.gradle

考虑下图:

Multi-Project Build in Gradle
现在，要创建一个多项目构建，请在根项目构建脚本中添加以下代码片段 ( 如: build.gradle ).

Closure cl = { task -> println "I'm $task.project.name" }
task('hello').doLast(cl)
project(':sub_project') {
    task('hello').doLast(cl)
}
将子项目包含到根项目中。为此，请在 setting.gradle 增加:

rootProject.name = 'multi_project'
include 'sub_project.'
使用以下命令执行它:

gradle -q hello
输出:

Multi-Project Build in Gradle
在Gradle中，可以从多项目构建的构建脚本访问任何项目。 Gradle的项目API提供了一个称为project()的方法；它以路径作为参数，并返回当前路径的项目对象。当从构建脚本配置项目构建时，则称为跨项目配置。这是通过配置注入实现的。

考虑另一种情况。项目sub_project下还有一个名为 Demo 的子项目。 Gradle项目的树结构如下:

Multi_project/

      - build.gradle

      - setting.gradle

Sub_project/

      - build.gradle

      - setting.gradle

Demo/

      - build.gradle

      - setting.gradle

我们可以从根项目中执行所有子项目。为此，重写根项目的生成脚本。将以下代码片段添加到根项目的build.gradle文件中:

allprojects {
    task hello {
        doLast { task ->
            println "I'm $task.project.name"
        }
    }
}
将子项目包括到根项目中。为此，请在setting.gradle中添加以下语句：

rootProject.name = 'multi_project'
include 'sub_project', 'Demo'
使用以下命令执行它；

gradle -q hello
输出:

Multi-Project Build in Gradle
仅访问子项目
Gradle Project API还简化了仅用于访问子项目的属性。

我们可以定义项目和子项目的共同行为。为此，按如下所示重写根项目构建脚本:

allprojects {
    task hello {
        doLast { task ->
            println "I'm $task.project.name"
        }
    }
}
subprojects {
    hello {
        doLast {
            println "- I depend on Multi_project"
        }
    }
}
使用以下命令执行它:

gradle -q hello
输出:

Multi-Project Build in Gradle
添加特定行为
我们可以在常见行为的基础上添加特定行为。通常，我们将特定于项目的行为放在要在其中添加特定功能的项目的构建脚本中。为此，我们必须更新该特定项目的构建脚本。要将特定行为添加到子项目中，请更新构建脚本，如下所示:

allprojects {
    task hello {
        doLast { task ->
            println "I'm $task.project.name"
        }
    }
}
subprojects {
    hello {
        doLast {
            println "- I depend on multi_project"
        }
    }
}
project(':sub_project').hello {
    doLast {
        println "- I contain the project's submodule." 
    }
}
使用以下命令执行它:

gradle -q hello
输出:

